package com.youlai.boot.modules.game.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.boot.common.result.PageResult;
import com.youlai.boot.modules.game.model.entity.GamePointsHistory;
import com.youlai.boot.modules.game.model.form.GamePointsForm;
import com.youlai.boot.modules.game.model.form.GameUserProfileForm;
import com.youlai.boot.modules.game.model.query.GameLeaderboardQuery;
import com.youlai.boot.modules.game.model.vo.GameLeaderboardVO;
import com.youlai.boot.modules.game.model.vo.GameUserInfo;

import java.util.List;

/**
 * 游戏排行榜服务接口
 *
 * @author 有来技术团队
 */
public interface GameLeaderboardService {

    /**
     * 获取排行榜列表
     *
     * @param queryParams 查询参数
     * @return 排行榜列表
     */
    List<GameLeaderboardVO> getLeaderboard(GameLeaderboardQuery queryParams);

    /**
     * 获取用户排名
     *
     * @param period 时间段
     * @return 用户排名信息
     */
    GameLeaderboardVO getUserRank(String period);

    /**
     * 更新用户积分
     *
     * @param formData 积分表单数据
     * @return 是否成功
     */
    boolean updatePoints(GamePointsForm formData);

    /**
     * 更新用户资料
     *
     * @param formData 用户资料表单
     * @return 是否成功
     */
    boolean updateUserProfile(GameUserProfileForm formData);

    /**
     * 获取用户积分历史
     *
     * @param pageNum  页码
     * @param pageSize 每页条数
     * @return 积分历史分页数据
     */
    PageResult<GamePointsHistory> getPointsHistory(Integer pageNum, Integer pageSize);
    
    /**
     * 获取用户积分分页列表
     *
     * @param pageNum   页码
     * @param pageSize  每页条数
     * @param username  用户名（可选，用于筛选）
     * @return 用户积分分页列表
     */
    Page<GameUserInfo> getUserPointsPage(Integer pageNum, Integer pageSize, String username);
    
    /**
     * 获取用户积分详情
     *
     * @param userId 用户ID
     * @return 用户积分详情
     */
    GameUserInfo getUserPoints(Long userId);

    /**
     * 记录排名变化
     *
     * @param userId     用户ID
     * @param period     时间段
     * @param rankBefore 变化前排名
     * @param rankAfter  变化后排名
     * @return 是否成功
     */
    boolean recordRankChange(Long userId, String period, Integer rankBefore, Integer rankAfter);
} 